//流控模块
package main

import "log"

//连接限制器
type ConnLimiter struct {
	//最大并发连接数
	concurrentConn int
	//通过 buffer channel实现流控
	//channel的 大小就是concurrentConn
	bucket chan byte
}

func NewConnLimiter(cc int) *ConnLimiter{
	cl:=&ConnLimiter{
		concurrentConn:cc,
		bucket:make(chan byte,cc),
	}
	return cl
}


//获取连接
//未达到并发上限返回true
func (cl *ConnLimiter) GetConn() bool{
	if len(cl.bucket)>=cl.concurrentConn{
		log.Println("达到最大上限")
		return false
	}
	cl.bucket<-1
	return true
}

//释放连接
//当请求结束后，释放连接
func (cl *ConnLimiter)ReleaseConn() {
	<-cl.bucket
	log.Println("请求处理结束，释放连接")
}




